יש במסד טבלאות, שונות ומשונות. אפשר לנחש למה הם שם, מה הם עושות, במה עדיף להשתמש ומתי ואפשר לא לנחש אלה פשוט לקרוא את ההמשך.
שישה סוגי טבלאות בסיסיים מגיעים ביחד עם ההתקנה של שרת ה-mysql
— MyISAM סוג הטבלה הבסיסי הקיים במסד.
InnoDB — טבלה עם אפשרויות מורחבות (טרנזאקציות, נעילות שורה, שמירה בטוחה)
Memory — טבלה שנשמרת אך ורק בזכרון ה-ram ומאותחלת עם כל הפעלה מחדש של המסד
BlackHole — טבלת חור שחור. היא לא באמת שומרת את הנתונים שלכם איפשהו
Archive — טבלת ארכיון, המסוגלת לנהל כמויות אדירות של מידע, במחיר של פונקציונאליות
CSV — טבלת comma seperated values
csv — comma seperated values
CSV - ראשי תיבות של "ערכים המופרדים בפסיקים" לעצמו הוא פורמט (אופן רישום) נתונים ישן מאוד. יעודו היה העברת מידע בין תוכנות ומחשבים נפרדים. מחשב אחד היה מייצר קובץ שיראה למשל ככה:
1,intval,qwerty
2,guide,111111
3,alex,abcabc
2,guide,111111
3,alex,abcabc
קובץ זה הכיל ערכים המופרדים בפסיקים, הצד המקבל ידע לפענח את הפורמט הזה ולקבל מתוכו את המידע הנדרש.
לתוך MySQL טבלה זו הגיעה למטרת נוחות. בעבר השימוש ב-csv היה מאוד פופולארי, ולתכניתנים היה הרבה יותר נוח להשתמש ב-sql כדי לעבוד עם הערכים בקובץ הזה, כאשר מנוע ה-mysql היה דואג לבד לעדכן ולבצע את כל הפעולות על הנתונים ולשים פסיקים במקומות הנכונים.
סביר להניח שלא ייצא לכם להשתמש בטבלאות מהסוג הזה, כיוון שהיום רווח השימוש בפורמט ה-xml , אבל סוג הטבלה הזה עדיין קיים ונגיש לאחר ההתקנה.
BlackHole
כשמו הוא — חור שחור. כל הנתונים שיגיעו אליו - יעלמו ברחווי היקום. שליפה ממנו תמיד תחזיר תוצאה ריקה של אפס שורות. הטבלה הזות פשוט קיימת, יש בה שדות, מפתחות (אינדקסים), אבל הנתונים בה פשוט לא נשמרים.
בשביל מה הטבלה הזו? שאלה טובה. השימוש העיקרי שלה הוא כאשר ברשותכם כמה שרתי mysql נפרדים שעליכם לסנכרן (לשמור על העתק מלא של הנתונים בין השרתים). לדוגמה יש לכם שרת ראשי, שעליו האתר שלכם מבצע את כל פעולות המשתמשים ושרת משני, שמשמש אך ורק לשמירת מידע גדול (כמו פרסומים בבלוג). אין סיבה שהשרת הראשון יכיל את טקסטי הבלוג, כאשר הוא גם כך נמצא תחת עומס מתמיד של פעולות המשתמשים, אבל הבעיה היא שהאתר עובד עם השרת הראשון, ולכן כל עדכון בלוג שתעשו דרך האתר - האתר ינסה לשמור בשרת הראשון.
במקרה הזה יהיה נוח לעשות בשרת הראשון טבלת בלוג מסוג חור שחור, שהאתר ינסה לשמור אליה את הנתונים. מנגנון הסנכרון יתפוס את הנתונים האלו, יעביר אותם לשרת השני, שם הם באמת יתעדכנו, ובשרת הראשון הם לא ישמר כלל, כך שלא יכביד עליו עול הזכרון .
בכל אופן, טבלאות כאלה קיימות, לא שומרות את הנתונים שלכם ואם תרצו להחביא משהו - זה המקום :)
Archive
ארכיון היא טבלה מצוינת לשמירת כמות נתונים עצומה לתווך ארוך. מנגד קיימות מספר מגבלות. הטבלה מאפשרת לבצע רק שני פעולות עליה: SELECT ו-INSERT. בגדול שום דבר אחר גם לא אמור להיות בטבלה הזו. אין אפשרות לעדכן ערכים או למחוקם בכלל.
אין תמיכה באינדקסים, auto_increment ובשום דבר מיותר אחר. מעולה לניהול לוגים, למשל מי ומתי הזדהה במערת ההזדהות של האתר. לכו תדעו מתי תצטרכו מידע כזה, אבל שיהיה.
Memory
טבלה שנשמרת בזכרון ה-ram של השרת. מהירה בטירוף, אבל מוגבלת בגודל מסיבות ברורות, לא שומרת את הנתונים לתווך הרחוק ובכלל מעולה לשמירה של נתונים זמניים. אם המסד ייפול, כל הנתונים שנשמרו בטבלה הזו יעלמו, למרות שהטבלה עצמה וכל המבנה שלה ימשיכו להתקיים.
MyISAM
עד לא מזמן טבלת ברירת המחדל של MySQL. טבלה מאוד בסיסית, יעילה בשליפות, מעט איטית בהכנסת נתונים, תומכת באינדקסים, auto_increment וכל הדברים האחרים שאתם רגילים אליהם מרוב השימוש בטבלאות אלו. יש הגבלה של כמות שורות אפשרית, העומדת על 4 מיליאד. והכי חשוב: ניתן ליצור אינדסים על שדות מסוג טקסט ומידע בינארי, מה שמאפשר לבצע בהם חיפוש.
InnoDB
המחליפה של MyISAM בגרסאות החדשות של mysql. היא עוצבה לעבודה יעילה עם כמויות מידע גדולות, והביצועים שלה תחת עומס גדול עוקפים בהרבה מסדי נתונים וסוגי טבלאות אחרים. InnoDB תומכת בטראנזקציות, כלומר בנויה במיוחד לענות לדרישות גבוהות של עמידות, בידוד מידע ועקביות. רק טבלאות InnoDB נותנות אחראיות לשמירה ותקינות הנתונים שלכם גם במקרה שפתאום באמצע השאילתה יתנתק החשמל.
כתיבה לטבלה זו מהירה בהרבה מכתיבה לטבלה מסוג MyISAM, בזכות מנגנון נעילת שורה. בטבלאות MyISAM, כאשר היה מתבצע עדכון נתונים כלשהו, היה המסד חוסם את קובץ הנתונים לקריאה/כתיבה מפני חיבורים מקבילים עד שיסיים לעדכן את הנתונים (אחרת שליפה מקבילה עשויה
כך נגרמו המתנות מיותרות: במידה ובאתרכם גלשו בבת אחת שני משתמשים, ואחד הגולשים היה מפעיל סקריפט עדכון שלהו, המסד היה נועל את הקובץ עד סיום העדכון בו, והסקריפט של המשתמש השני חיקה לו. אם גלשו באתרכם יותר משתמשים במקביל, היה המצב מחריף.
InnoDB, לאומתה, נועלת רק את השורה שבה נעשה העדכון ושאר הטבלה זמינה לכתיבה וקריאה לשאר הגולשים, גם בטבלאות שגודלם מגיעה ל 1 TerraByte.
שני חסרונות קלים מאפשרים את קיומה של MyISAM:
א. MyISAM מבצעת פעולות שליפה מעט מעט יותר מהר
ב. MyISAM מאפשר לבצע חיפוש (full text search) וליצור אינדקסים על שדות מסוג Text. כלומר לאנדקס את כל תוכן שדות מסוג טקבט ולבצא בהם חיפושים יעילים יותר. שימו לב שלא מדובר מחיפוש מסוג LIKE שהוא זמין גם ב-InnoDB.
מאתה אלה הם טבלאות ברירת המחדל במסד ורצוי להשתמש בהם במקום MyISAM.
תגובות לכתבה:
אחלה של הסבר :) אם כי אולי יש טעויות כתיב פה ושם. אבל זה הסיבה שהתחלתי את התגובה ב "אחלה של הסבר" כי זה מה שבולט פה יותר וההסבר על ההבדלים מובן מאוד.
שאפילו אני שלא מבין עדיין על מסדי נתונים הבנתי שיותר כדאי לי להשתמש עם InnoDB מאשר MyISAM רק במקרה שיש לי למעלה מאלפים של גולשים מחוברים באתר. (בעתיד אני מקווה :) )
ועוד דבר לפי מה שנראה לי שאם באמת מחפשים יותר ביצועים אז כנראה משתמשים עם כמה טבלאות שונות עם מנועים שונים בשביל ביצועים יותר מועילים :)
ושוב תודה רבה א ח ל ה ש ל ה ס ב ר !!! :)
שמחתי שנהנית ולמדת משהו חדש :)
גם במקרים של מעט שורות בטבלה בכל זאת יש טעם להשתמש דווקא ב-INNODB
פרגנתי, לא תמיד מוצאים ברשת בדיוק את התוכן שמחפשים ועוד בעברית
מישהו מעוניין פה שאני אכתוב מדריך בנושא PARTITION ועבודה מול DB גדולים?
כל מדריך יתקבל בברכה. :)
אני לא ממש מצליח ליצור FK באמצעות myISAM ורשום לי בפורומים שזה לא ממש אפשרי . .
אשמח לייעוץ
זה בלתי אפשרי עם myisam.
רק עם innodb.
מדריך מעולה תודה רבה
PARTITION ועבודה מול DB גדולים
זה בדיוק מה שאני מחפש - אשמח אם תמצא זמן לכתוב מדריך
שוב תודה